/**
 * Universidade Federal de Campina Grande - UFCG
 * Departamento de Sistemas e Computação - DSC
 * Disciplina: Compiladores
 * Professor: Marcus Salerno
 * 
 * Projeto da Disciplina - Analisador Lexico
 * 
 *  
 * Contributors:
 * Arthur
 * Carolina
 * Saulo
 * 
 */
package main;

import geradordecodigo.GeradorDeCodigo;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import lexico.AnalisadorLexico;
import sintatico.AnalisadorSintatico;
import util.Simbolo;

public class Principal {

    private static AnalisadorSintatico sintatico;
    private static AnalisadorLexico lexico;
    
	public static void main(String args[]) {
		// pega o path do worksapce
		String pathWorkspace = getWorkspace();
					
		String[] files = { 
				pathWorkspace + "exemplo01.pas"
				,
				pathWorkspace + "exemplo02.pas"
				,
				pathWorkspace + "exemplo03.pas"
				,
				pathWorkspace + "exemplo04.pas"
				,
				pathWorkspace + "exemplo05.pas"
				};
		
		for (String fileName : files) {
			System.out.println("Compilando: " + fileName);
			// eh feita a analisa lexica
			lexico = new AnalisadorLexico(new File(fileName));
			List<Simbolo> simbolos = lexico.analise();
			System.out.println("OK :: Analise Lexica");
			
			// eh feita a analisa sintatica			
			sintatico = new AnalisadorSintatico(simbolos);
            if (sintatico.analise()) {
                // geracao de codigo
            	System.out.println("OK :: Gerador de Codigo");
                ArrayList<String> code = GeradorDeCodigo.getCodigoGerado();
                for(int j = 0; j < code.size(); j++){
                    System.out.println("         " + code.get(j));
                }
            }
		}
	}

	private static String getWorkspace() {
		String[] localDeTrabalho = classLocation( Principal.class ).getPath().split("\\" + File.separator);
		
		String pathWorkspace = "";
		for (String local : localDeTrabalho) {
			pathWorkspace += local + File.separator;
			if (local.equalsIgnoreCase("PascalForHumanBeings")){
				pathWorkspace += "src"+ File.separator + "testes" + File.separator;
				return pathWorkspace;
			}
		}
		return pathWorkspace;
	}

	static String readLn() {
		String newLine = System.getProperty("line.separator");
		StringBuffer buffer = new StringBuffer();
		int car = -1;
		try {
			car = System.in.read();
			while ((car > 0) && (car != newLine.charAt(0))) {
				buffer.append((char)car);
				car = System.in.read();
			}
			if (car == newLine.charAt(0))
				System.in.skip(newLine.length() - 1);
		} catch (java.io.IOException e) { return (null);}
		if ((car < 0) && (buffer.length() == 0)) return (null);
		return (buffer.toString()).trim();
	}
	
	public static File classLocation( Class cls ) {
		if( cls == null )
			return null ;
		String name = cls.getName().replace( '.' , '/' ) ;
		URL loc = cls.getResource( "/" + name + ".class" ) ;
		File f = new File( loc.getFile() ) ;
		// Class file is inside a jar file.
		if( f.getPath().startsWith( "file:" ) ) {
			String s = f.getPath() ;
			int index = s.indexOf( '!' ) ;
			// It confirm it is a jar file
			if( index != -1 ) {
				f = new File( s.substring( 5 ).replace( '!' , File.separatorChar ) ) ;
				return f ;
			}
		}
		try {
			f = f.getCanonicalFile() ;
		}catch( IOException ioe ) {
			ioe.printStackTrace() ;
			return null ;
		}
		return f ;
	}
	
	
}
